package builders;

import entidades.Cor;
import java.util.HashMap;
import entidades.Familia;
import entidades.Textura;
import java.util.Map;
import sistema.Sistema;

/**
 * Trabalho DAS - 2014/2015
 *
 * @author a21210380, a21190325, a21210392
 */
public class BuilderDeFamilia {

    private final static Integer VALOR_COR_LINHA = 1;
    private final static Integer VALOR_FUNDO = 2;
    private final static Integer VALOR_COR_TEXTO = 3;
    private final static Integer VALOR_NOME = 4;

    private final Map<Integer, Object> valores = new HashMap<>();

    public String getNomeDaFamilia() {
        return (String) valores.get(VALOR_NOME);
    }

    public boolean setNomeDaFamilia(String nomeDaFamilia) {
        if (nomeDaFamilia == null) {
            throw new NullPointerException("cor não pode ser null!");
        }
        if(Sistema.getInstance().nomeDaFamiliaDisponivel(nomeDaFamilia)){
            valores.put(VALOR_NOME, nomeDaFamilia);
           return true;
        }
        return false;
    }

    public final Textura getFundo() {
        return (Textura) valores.get(VALOR_FUNDO);
    }

    public final void setCorDaLinha(Cor cor) {
        if (cor == null) {
            throw new NullPointerException("setCorDaLinha não pode ser null!");
        }
        valores.put(VALOR_COR_LINHA, cor);
    }

    public final Cor getCorDaLinha() {
        return (Cor) valores.get(VALOR_COR_LINHA);
    }

    public final void setCorDoTexto(Cor cor) {
        if (cor == null) {
            throw new NullPointerException("setCorDoTexto não pode ser null!");
        }
        valores.put(VALOR_COR_TEXTO, cor);
    }

    public final Cor getCorDoTexto() {
        return (Cor) valores.get(VALOR_COR_TEXTO);
    }

    public final void setFundo(Textura textura) {
        if (textura == null) {
            throw new NullPointerException("setFundo não pode ser null!");
        }
        valores.put(VALOR_FUNDO, textura);
    }

    public boolean estaPronto() {
        return valores.size() == 4;
    }

    public Familia construirFamilia() {
        if (estaPronto()) {
            return new Familia(
                    getNomeDaFamilia(),
                    getCorDaLinha(),
                    getCorDoTexto(),
                    getFundo());
        }
        throw new IllegalStateException("O estilo não está pronto!");
    }
}
